{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://time.geekbang.org/column/article/408409\n",
    "\n",
    "你好，我是陈天。今天我们打卡 Rust 学习的第一讲。\n",
    "\n",
    "你是不是已经迫不及待想要了解 Rust 了，但是别着急，我们不会按常规直接开始介绍语法，而会先来回顾那些你平时认为非常基础的知识，比如说内存、函数。\n",
    "\n",
    "提到基础知识，你是不是已经有点提不起兴趣了，这些东西我都知道，何必浪费时间再学一次呢？其实不然，这些年我接触过的资深工程师里，基础知识没学透，工作多年了，还得回来补课的大有人在。\n",
    "\n",
    "以最基础的内存为例，很多人其实并没有搞懂什么时候数据应该放在栈上，什么时候应该在堆上，直到工作中实际出现问题了，才意识到数据的存放方式居然会严重影响并发安全，无奈回头重新补基础，时间精力的耗费都很大。\n",
    "\n",
    "其实作为开发者，我们一辈子会经历很多工具、框架和语言，但是这些东西无论怎么变，底层逻辑都是不变的。\n",
    "\n",
    "所以今天我们得回头重新思考，编程中那些耳熟能详却又似懂非懂的基础概念，搞清楚底层逻辑。而且这些概念，对我们后面学习和理解 Rust 中的知识点非常重要，之后，我们也会根据需要再穿插深入讲解。\n",
    "\n",
    "代码中最基本的概念是变量和值，而存放它们的地方是内存，所以我们就从内存开始。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 内存\n",
    "\n",
    "我们的程序无时无刻不在跟内存打交道。\n",
    "\n",
    "在下面这个把 `“hello world!”` 赋值给 s` 的简单语句中，就跟**只读数据段**（RODATA）、**堆**、**栈**分别有深度交互："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "vscode": {
     "languageId": "rust"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"hello world\""
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "let s = \"hello world\".to_string();\n",
    "s"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "你可以使用 [Rust playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8f515709abd520d98a6ac7b854227652) 里这个代码片段 感受一下字符串的内存使用情况。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "vscode": {
     "languageId": "rust"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "addr of ss: 0x7f6d4566ccc8, s: 0x7ffe2f4a9928, len: 11, capacity: 11, size: 24\n"
     ]
    }
   ],
   "source": [
    "println!(\"addr of ss: {:p}, s: {:p}, len: {}, capacity: {}, size: {}\", \n",
    "        &\"hello world\", &s, s.len(), s.capacity(), std::mem::size_of_val(&s));"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Rust",
   "language": "rust",
   "name": "rust"
  },
  "language_info": {
   "codemirror_mode": "rust",
   "file_extension": ".rs",
   "mimetype": "text/rust",
   "name": "Rust",
   "pygment_lexer": "rust",
   "version": ""
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
